package com.baseproject.datasource.get.procedure;

import com.baseproject.datasource.Repository;
import com.baseproject.util.NetworkUtils;

import java.net.UnknownHostException;
import java.util.List;

import rx.Observable;
import rx.functions.Func1;

/**
 * 1:网络请求内部抛出异常：
 * 1.1：未打开手机网络开关:                                                       网络流程异常，需要后续的本地获取,需要回调onError
 * 1.2：网络异常(包含responseBody.string()异常和responseString为空的异常)         网络流程异常，需要后续的本地获取,需要回调onError
 * 2：网络请求结果处理时：
 * 2.1： 需要登录或支付时抛出的异常      网络流程正常，业务流程异常，不需要后续的本地获取,需要回调onError      ok
 * 2.2：data中没有数据，正常返回null     网络流程正常，业务流程正常，不需要后续的本地获取,需要回调onNext       ok
 * <p>
 * 1.2为目前主要需要处理的点，目前只对应RemoteFirst模型，需要同时上报onError并对接新的本地Observable，
 * onErrorResumeNext，flatmap(三参数)对onError进行了拦截，而concat并不会触发本地Observable，doOnNext无法对接本地Observable，
 * 解决方案为onErrorResumeNext拦截，并把需要在onError中做的事情放在onErrorResumeNext，
 * 可以使用CommonRemote模型来替代RemoteFirst模型
 */

public class RemoteFirstDataProcedure extends DataProcedure {

    public RemoteFirstDataProcedure(Class className) {
        super(className);
    }

    @Override
    public <T> Observable<List<T>> getList(Class<T> className) {
        return Repository.getInstance().getListFromRemoteDataSource(this, this.getClassName())
                .flatMap(new Func1<List<T>, Observable<List<T>>>() {
                    @Override
                    public Observable<List<T>> call(List<T> contentList) {
                        if (null != contentList && contentList.size() > 0) {//网络获取到了数据
                            return Observable.just(contentList);
                        } else {
                            return Repository.getInstance().getListFromLocalDataSource(RemoteFirstDataProcedure.this,
                                    RemoteFirstDataProcedure.this.getClassName());
                        }
                    }
                })
                .onErrorResumeNext(new Func1<Throwable, Observable>() {
                    @Override
                    public Observable call(Throwable throwable) {
                        if (throwable instanceof UnknownHostException) {//网络开关关闭，网络异常
                            NetworkUtils.showHintIfNetworkNotAvailable(throwable);
                            return Repository.getInstance().getListFromLocalDataSource(RemoteFirstDataProcedure.this,
                                    RemoteFirstDataProcedure.this.getClassName());
                        }
                        return Observable.error(throwable);
                    }
                });

    }
}
